// 预处理指令，由预处理器解释。
#include "header_common.h"  // stdio.h的库函数头文件的内容替换这一行。标准I/O库。
#define MAX_COLS 20  // 所能处理的最大列号
// #define定以后不能再重新赋值了。不能出现在赋值符的左边。
#define MAX_INPUT 1000 // 每个输入行的最大长度
// 预处理指令 -- 结束

// 预处理器读入源代码，根据预处理指令对齐进行修改，然后把修改过的源代码递交给编译器。

// 可以放到头文件中，并使用#include包含他们。
// 函数原型
int read_column_numbers(int columns[], int max);
// 声明为const，表示函数将不会修改函数调用者传递的这两个参数
void rearrange(char *output, char const *input, int n_columns ,int const columns[]);

int main( void ) // void 表示函数不接受任何参数。
{
    // 已经包含过了，可以直接使用
    int n_columns; // 一共输入了几个数
    int columns[MAX_COLS];
    char input[MAX_INPUT];
    char output[MAX_INPUT];

    n_columns = read_column_numbers( columns, MAX_COLS );
    // gets函数从标准输入读取一行文本并把它存储于作为参数传递给他的数组中,即input。
    while(gets( input ) != NULL){
        printf("Original input : %s \n",input);
        rearrange(output,input,n_columns,columns);
        printf("Rearranged line : %s \n",output);
    }

    // 从逻辑上删除一段C代码
    #if 0
        printf();
    #endif

    return EXIT_SUCCESS;
}

// 允许单个函数曹总任意长度的一维数组
int read_column_numbers(int columns[], int max) {

    int num = 0; // 一共输入了几个数
    // 它的初始值是一个不可预料的值,因为没有进行初始化；所使用的地址
    int ch; // 它被声明为int类型
    // 判断输入的值要小于最大值 && 输入成功 && 数字是大于等于0的数
    while (num < max && scanf("%d", &columns[num]) == 1 && columns[num] >= 0)
        num += 1;
    if(num%2 != 0){ // 这个判断输入的数字是否是成对出现
        puts("Last column number is not paired.");
        exit(EXIT_FAILURE);
    }
    // 丢弃该行中包含最后一个数字的那部分内容，一直到getchar返回EOF或换行符时结束。
    while((ch = getchar()) != EOF && ch != '\n')
        ;
    return num;
}
// 函数的含义，
// 从第4个(包含)开始拷贝，拷贝9-4+1个，到第9个(包含)
// 从第12个(包含)开始拷贝，拷贝20-12+1个
void rearrange(char *output, char const *input, int n_columns ,int const columns[]){
    int col;
    int output_col;
    int len;

    len = strlen(input); ///< 26
    output_col = 0;
    for (col = 0; col < n_columns;col += 2){
        // [1] 表示第一轮走； [2] 表示第二轮走； [3] 表示第三轮走
        // [1] 假设输入 4 9 12 20 -1，n_columns即4
        // [1] columns 是输入的数字 数组 [4 9 12 20]
        // [1] nchars = 9 - 4 + 1 = 6
        // [2] nchars 20 - 12 + 1 = 9
        // [3] 不会走第三轮，col > n_columns 了；4 < 4 跳出了；
        int nchars = columns[col + 1] - columns[col] + 1;
        // [1] 4 >= 26 false   0 == 999 false
        // [2] 12 >= 26 false  6 == 999 false

        // 如果数组中第一个数字大于字符串的长度 或  当前输出的字符串已经是最长的了 跳出
        if(columns[col] >= len || output_col == MAX_INPUT -1){
            break;
        }
        // [1] 0 + 6 > 999 false
        // [2] 6 + 9 > 999 false

        printf("nchars == %d \n", nchars);
        // 如果输出行数据空间不够，只复制可以容纳的数据
        if(output_col + nchars > MAX_INPUT - 1){
            nchars = MAX_INPUT - output_col - 1;
        }
        // [1] 0 + 0, 字符串第4个开始(包含第5个字符) ，6个
        // [1] output = efghij
        // [2] 0 + 6 , 字符串第12个开始(包含第12个字符)，9个
        // [2] output = efghij + mnopqrstu
        // 当nchars为负数时，因为strncpy最后一个参数是unsigned，所以全copy
        strncpy(output + output_col, input + columns[col], nchars);
        output_col += nchars;
        // [1] output_col = 6
    }
    output[output_col] = '\0';
}